/**
 * 文件处理服务
 */

import { LanguageFile, ProcessProgress } from '../types';
import { parseExcelFile, validateFileType, validateFileSize } from '../utils/fileUtils';
import { detectConflicts, generateLanguageFiles } from '../utils/languageUtils';

/**
 * 文件处理服务类
 */
export class FileService {
  /**
   * 处理文件上传
   */
  static async processFile(
    file: File,
    onProgress: (progress: ProcessProgress) => void
  ): Promise<{
    languageFiles: LanguageFile[];
    conflicts: any;
    generatedFiles: any[];
  }> {
    try {
      // 验证文件
      onProgress({
        status: 'uploading',
        progress: 10,
        message: '验证文件格式...',
      });

      if (!validateFileType(file)) {
        throw new Error('不支持的文件格式，请上传.xlsx文件');
      }

      if (!validateFileSize(file)) {
        throw new Error('文件大小超过限制，请上传小于10MB的文件');
      }

      // 解析Excel文件
      onProgress({
        status: 'parsing',
        progress: 30,
        message: '解析Excel文件...',
      });

      const languageFiles = await parseExcelFile(file);

      if (languageFiles.length === 0) {
        throw new Error('未找到有效的语言数据');
      }

      // 检测冲突
      onProgress({
        status: 'parsing',
        progress: 60,
        message: '检测翻译冲突...',
      });

      const conflicts = detectConflicts(languageFiles);

      // 生成语言文件
      onProgress({
        status: 'generating',
        progress: 80,
        message: '生成语言文件...',
      });

      const generatedFiles = generateLanguageFiles(languageFiles);

      // 完成
      onProgress({
        status: 'completed',
        progress: 100,
        message: '处理完成！',
      });

      return {
        languageFiles,
        conflicts,
        generatedFiles,
      };
    } catch (error) {
      onProgress({
        status: 'error',
        progress: 0,
        message: '处理失败',
        error: error instanceof Error ? error.message : '未知错误',
      });
      throw error;
    }
  }

  /**
   * 批量下载文件
   */
  static async downloadFiles(generatedFiles: any[]): Promise<void> {
    try {
      // 使用JSZip创建压缩包
      const JSZip = (await import('jszip')).default;
      const zip = new JSZip();

      // 添加文件到压缩包
      generatedFiles.forEach(file => {
        zip.file(file.fileName, file.content);
      });

      // 生成压缩包
      const zipBlob = await zip.generateAsync({ type: 'blob' });

      // 下载压缩包
      const link = document.createElement('a');
      link.href = URL.createObjectURL(zipBlob);
      link.download = 'language-files.zip';
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
      URL.revokeObjectURL(link.href);
    } catch (error) {
      throw new Error('下载失败: ' + (error instanceof Error ? error.message : '未知错误'));
    }
  }

  /**
   * 下载单个文件
   */
  static downloadSingleFile(fileName: string, content: string): void {
    try {
      const blob = new Blob([content], { type: 'text/plain;charset=utf-8' });
      const url = URL.createObjectURL(blob);
      const link = document.createElement('a');
      link.href = url;
      link.download = fileName;
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
      URL.revokeObjectURL(url);
    } catch (error) {
      throw new Error('下载失败: ' + (error instanceof Error ? error.message : '未知错误'));
    }
  }
}
